Refactor: process_instruction()#20448
Conversation
b051b76 to
a851842
Compare
a851842 to
fe09137
Compare
fe09137 to
4e29b54
Compare
17fe3c1 to
05cce99
Compare
05cce99 to
cf86549
Compare
Codecov Report
@@ Coverage Diff @@
## master #20448 +/- ##
=========================================
- Coverage 82.3% 82.1% -0.3%
=========================================
Files 497 492 -5
Lines 136959 137083 +124
=========================================
- Hits 112854 112673 -181
- Misses 24105 24410 +305 |
There was a problem hiding this comment.
I see the assert above but maybe its clearer to just pass the skip variable through?
There was a problem hiding this comment.
Any reason this isn't a structure to help with readability?
There was a problem hiding this comment.
Why are these now tuples and not KeyedAccounts?
There was a problem hiding this comment.
These magic numbers are confusing and there is not info here to indicate what they are based on. Also, is _skip_program_accounts == 1 here, if so, why not base on that?
There was a problem hiding this comment.
You are right that we should document what keyed_account_at_index() is based / operating on.
Because now, it is always the beginning of the program chain, followed by the instruction accounts.
I also thought about parametrizing keyed_account_at_index() with skip_program_accounts.
However, that would introduce yet another method like keyed_account_at_base_and_index(keyed_accounts, skip_program_accounts, index), or keyed_account_at_index(keyed_accounts, skip_program_accounts + index) which is getting very long and will be short-lived as it is replaced by the ABIv2 account access pattern.
|
About the ugly I made all the tests to have the wrapper Now, why switch some of the test to |
cf86549 to
d683925
Compare
91e41da to
61ccc47
Compare
61ccc47 to
1495ecd
Compare
There was a problem hiding this comment.
Name these or at leat provide a comment describing why they are the value that they are
jackcmay
left a comment
There was a problem hiding this comment.
Look good, just one remaining nit about documenting a couple of magic numbers
dd1982a to
579579a
Compare
| instruction_data: &[u8], | ||
| invoke_context: &mut dyn InvokeContext, | ||
| ) -> Result<(), InstructionError> { | ||
| debug_assert_eq!(first_instruction_account, 1); |
There was a problem hiding this comment.
@Lichtso it's possible to hit this debug assert with the tx I described here: https://github.com/solana-labs/solana/pull/21238/files?diff=split&w=0#r752263887
* Adds first_instruction_account parameter to process_instruction(). * Removes InvokeContext::remove_first_keyed_account() from all BPF loaders. * Removes InvokeContext::remove_first_keyed_account() from all builtin programs. * Removes InvokeContext::remove_first_keyed_account() from all mock ups. * Deprecates InvokeContext::remove_first_keyed_account(). * Documents index base of keyed_account_at_index(). * Adds dynamic offset to call sites of "keyed_account_at_index()".
This reverts commit 8b7da50.
Problem
The runtime currently uses
InvokeContext::remove_first_keyed_account()to pop off the front of the programKeyedAccounts of each invoke stack frame. That necessitates the invoke stack frame to be writable and we want to avoid that in ABIv2 (#19191). Because, if the invoke stack frames are immutable, they can be shared as read-only between runtime, loaders and programs alike with less internal validation checks.Summary of Changes
InvokeContext::remove_first_keyed_account()by introducing anum_program_accountsparameter (which is acting as a cursor) toprocess_instruction().Fixes #